import CryptoJS from 'crypto-js/crypto-js'

// 默认的 KEY 与 iv 如果没有给
const KEY = CryptoJS.enc.Utf8.parse('1234567890123456')
const IV = CryptoJS.enc.Utf8.parse('1234567890123456')
/**
 * AES加密 ：字符串 key iv  返回base64
 */
export function Encrypt(word, keyStr, ivStr) {
  let key = KEY
  let iv = IV

  if (keyStr) {
    key = CryptoJS.enc.Utf8.parse(keyStr)
    iv = CryptoJS.enc.Utf8.parse(ivStr)
  }

  let srcs = CryptoJS.enc.Utf8.parse(word)
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding,
  })
  // console.log("-=-=-=-", encrypted.ciphertext)
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
}
/**
 * AES 解密 ：字符串 key iv  返回base64
 *
 */
export function Decrypt(word, keyStr, ivStr) {
  let key = KEY
  let iv = IV

  if (keyStr) {
    key = CryptoJS.enc.Utf8.parse(keyStr)
    iv = CryptoJS.enc.Utf8.parse(ivStr)
  }

  let base64 = CryptoJS.enc.Base64.parse(word)
  let src = CryptoJS.enc.Base64.stringify(base64)

  var decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding,
  })

  var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
  return decryptedStr.toString()
}

/* 生成随机密码：包含大小写字母、数字和特殊符号 
‌字符集‌：定义了包含大写字母、小写字母、数字和特殊字符的字符集。
‌初始密码‌：确保每种字符类型（大写字母、小写字母、数字和特殊符号）至少有一个字符。
‌填充剩余字符‌：从所有字符集中随机选择字符，直到达到所需的密码长度。
‌打乱密码‌：使用 Fisher-Yates 洗牌算法打乱密码中的字符顺序，以确保字符分布均匀。
*/
export function generateRandomPassword(minLength = 8, maxLength = 12) {
  if (minLength < 4) {
    throw new Error('密码长度至少为4，以包含大小写字母、数字和特殊符号')
  }
  // 字符集
  const upperCase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  const lowerCase = 'abcdefghijklmnopqrstuvwxyz'
  const numbers = '0123456789'
  const specialChars = '!@#$%&*()_+[]{}|;:,.<>?'

  // 确定密码长度
  const length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength

  // 确保每种字符至少有一个
  const allChars = upperCase + lowerCase + numbers + specialChars

  let password = [
    upperCase[Math.floor(Math.random() * upperCase.length)],
    lowerCase[Math.floor(Math.random() * lowerCase.length)],
    numbers[Math.floor(Math.random() * numbers.length)],
    specialChars[Math.floor(Math.random() * specialChars.length)],
  ]

  // 填充剩余字符
  for (let i = password.length; i < length; i++) {
    password.push(allChars[Math.floor(Math.random() * allChars.length)])
  }

  // 打乱密码
  for (let i = password.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1))
    ;[password[i], password[j]] = [password[j], password[i]]
  }

  return password.join('')
}

/* 验证密码强度 */
export function validatePasswordStrength(password) {
  let level = 0 // 默认 0 级
  const minLength = 8
  const hasLowercase = /[a-z]+/.test(password)
  const hasUppercase = /[A-Z]+/.test(password)
  const hasNumber = /\d+/.test(password)
  const hasSpecialChar = /[\W_]+/.test(password)

  // 检查密码长度和包含的类型
  const isValidLength = password.length >= minLength
  // const hasRequiredTypes = hasLowercase && hasUppercase && hasNumber && hasSpecialChar

  if (hasLowercase) {
    level++
  }
  if (hasUppercase) {
    level++
  }
  if (hasNumber) {
    level++
  }
  if (hasSpecialChar) {
    level++
  }
  if (isValidLength) {
    level++
  }
  // return isValidLength && hasRequiredTypes
  return level
}
